package de.hdu.myjobapp.view;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import org.apache.log4j.Logger;
import org.dellroad.stuff.vaadin.SpringContextApplication;

import com.vaadin.Application;
import com.vaadin.service.ApplicationContext.TransactionListener;
import com.vaadin.ui.Window;

import de.hdu.myjobapp.ctrl.UiHandler;
import de.hdu.myjobapp.dao.ApplicationDao;
import de.hdu.myjobapp.dao.AttachmentDao;
import de.hdu.myjobapp.dao.KeywordDao;
import de.hdu.myjobapp.dao.OrganisationDao;
import de.hdu.myjobapp.dao.RatingDao;
import de.hdu.myjobapp.dao.StatusDao;
import de.hdu.myjobapp.dao.UserDao;
import de.hdu.myjobapp.model.Keyword;
import de.hdu.myjobapp.model.Organisation;
import de.hdu.myjobapp.model.User;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.web.context.ConfigurableWebApplicationContext;



/**
 * Base Vaadin Application Class
 * @author mta,eis,sp
 *
 */
public class MyJobApplication extends SpringContextApplication 
			implements TransactionListener, BeanFactoryAware, InitializingBean, DisposableBean, Serializable {
	private Logger log = Logger.getLogger(MyJobApplication.class);
	private static final long serialVersionUID = 1L;
	/**
	 * Default Constructor
	 */
	public MyJobApplication() {
		log.info(this.getClass().getSimpleName() + " constructor invoked");
		
    }
	
	//
	// Demodaten Initialisierung für den Zugriff
	//
	UserDao userDao;
	ApplicationDao applicationDao;
	AttachmentDao attachmentDao;
	KeywordDao keywordDao;
	OrganisationDao organisationDao;
	RatingDao ratingDao;
	StatusDao statusDao;
	
	public void setUserDao(UserDao userDao){
		this.userDao = userDao;
	}
	public UserDao getUserDao(){
		return this.userDao;
	}
	public void setApplicationDao(ApplicationDao applicationDao){
		this.applicationDao = applicationDao;;
	}
	public ApplicationDao getApplicationDao(){
		return this.applicationDao;
	}
	public void setAttachmentDao(AttachmentDao attachmentDao){
		this.attachmentDao = attachmentDao;
	}
	public AttachmentDao getAttachmentDao(){
		return this.attachmentDao;
	}
	public void setKeywordDao(KeywordDao keywordDao){
		this.keywordDao = keywordDao;
	}
	public KeywordDao getKeywordDao(){
		return this.keywordDao;
	}
	public void setOrganisationDao(OrganisationDao organisationDao){
		this.organisationDao = organisationDao;
	}
	public OrganisationDao getOrganisationDao(){
		return this.organisationDao;
	}
	public void setRatingDao(RatingDao ratingDao){
		this.ratingDao = ratingDao;
	}
	public RatingDao getRatingDao(){
		return this.ratingDao;
	}
	public void setStatusDao(StatusDao statusDao){
		this.statusDao = statusDao;
	}
	public StatusDao getStatusDao(){
		return this.statusDao;
	}
	//
	// Demodaten Initialisierung ENDE
	//
	/**
	 * inherited from abstract Interface
	 * @see org.springframework.beans.factory.BeanFactoryAware#setBeanFactory(org.springframework.beans.factory.BeanFactory)
	 */
    public void setBeanFactory(BeanFactory beanFactory){
    	
    }
    
	/**
	 * ThreadManagement - Isolate user sessions 
	 */
	private static ThreadLocal<MyJobApplication> thisApplication = new ThreadLocal<MyJobApplication>();

	private UiHandler ui;
	
	/**
	 *  Set ThreadLocal application.
	 *  @param MyJobApplication t	
	 */
	public static void setProject(MyJobApplication t) {
		thisApplication.set(t);
	}

	/**
	 *  Get ThreadLocal application.
	 *  From where to get ApplicationContext and so on
	 */
	public static MyJobApplication getProject() {
		return thisApplication.get();
	}
    /**
     * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
     */
	@Override
	public void afterPropertiesSet() {
	   log.info(this.getClass().getSimpleName() + ".afterPropertiesSet() invoked");
	}
	/**
	 * @see org.springframework.beans.factory.DisposableBean#destroy()
	 */
	@Override
	public void destroy() {
	   log.info(this.getClass().getSimpleName() + ".destroy() invoked");
	}	
	/**
	 * Initialisation of the Application
	 * This method is being called by the get-Method of 
	 * org.dellroad.stuff.vaadin.ContextApplication
	 */
	@Override
	protected void initSpringApplication(ConfigurableWebApplicationContext context) {
		log.info("initializing MyJobApplicationManager application...");
		/*
		 * sets the current application to ThreadLocal.
		 */
		setProject(this);
		/* 
		 * Creates the Main Window and then hands over all UI work to the UiHandler
		 */
		setMainWindow(new Window("MyJobApplicationManager"));
		//getMainWindow().showNotification(log.toString());
		/*
		 * setTheme to recognize folder where to search
		 */
		setTheme("reindeer");

		/*
		 * Instatiate the UIHandler for later use
		 */
		ui = new UiHandler(getMainWindow());

		/* 
		 *  Adds a TransactionListener for this class.
		 */
		getContext().addTransactionListener(this);

		/*
		 *  Register user change listener for UiHandler.
		 */
		addListener(ui);
		
		
		
		/*
		 * insert the demo-data in the database
		 * Demo Data coming from Dolomiti Superbike Race 2011 110km
		 * source: http://services.datasport.com/2011/mtb/dolomiti/RANG161.HTM
		 */
		List<User> users = userDao.findAll();
		if(users.isEmpty()){
			userDao.create("uhuber", "Urs Huber", "urs"); //id=0
			userDao.create("alakata", "Alban Lakta", "alban");//id=1
			userDao.create("jvastaranta", "Jakka Vastaranta", "jakka");//id=2
			userDao.create("kplatt", "Karl Platt", "karl");//id=3
			userDao.create("mcelestino", "Mirko Celestino", "mirko");//id=4
			userDao.create("mdebertolis", "Massimo de Bertolis", "massimo"); //id=5
			userDao.create("jcattaneo", "Johnny Cattaneo", "johnny");//id=6
			userDao.create("mpirazzoli", "Mirko Pirazzoli", "mirko");//id=7
			userDao.create("yzoli", "Yaer Zoli", "yader");//id=8
			userDao.create("cwalter", "Walter Costa", "walter");//id=9
			userDao.create("lronchi", "Luca Ronchi", "luca");//id=10
			userDao.create("tal", "Thijs Al", "al");//id=11
			users = userDao.findAll();
		}
		List<Keyword> keywords = keywordDao.findAll();
		if(keywords.isEmpty()){
			/*
			 * Keytype 0 = Rating of Application
			 */
			keywordDao.create(1, 0, "Gehalt");
			keywordDao.create(2, 0, "Nähe zum Wohnort");
			keywordDao.create(3, 0, "Image");
			keywordDao.create(4, 0, "Attraktivität angebotene Stelle");
			keywordDao.create(5, 0, "Karrierechancen");
			keywordDao.create(6, 0, "Arbeitszeit");
			keywordDao.create(7, 0, "Dienstfahrzeug");
			keywordDao.create(8, 0, "Standortimage neuer Arbeitsplatz");
//			keywordDao.create(9, 0, "");
//			keywordDao.create(10, 0, "Gehalt");
//			keywordDao.create(11, 0, "Gehalt");
			keywords = keywordDao.findAll();
		}
		List<Organisation> organisations = organisationDao.findAll();
		if(organisations.isEmpty()){
			organisationDao.create("Rubner EBG GmbH", "Handwerkerzone", "2", "Kiens", "39030", "Italien", "08:00 - 17:00 Uhr");//id=0
			organisationDao.create("Nordlam AG", "Gasereistraße", "1", "Magdeburg", "39126", "Deutschland", "");//id=1
			organisationDao.create("Holzbau AG", "Alfred Amonn Straße", "12", "Brixen", "39042", "Italien", "");//id=2
			organisationDao.create("Wolf System GmbH", "Am Stadtwald ", "20", "Osterhofen", "94486", "Deutschland", "");//id=3
			organisationDao.create("IBM Deutschland GmbH", "IBM-Allee", "1", "Ehningen", "71139", "Deutschland", "");//id=4
			organisationDao.create("Microsoft Deutschland GmbH", "Konrad Zuse Straße", "1", "Unterschleißheim", "85716", "Deutschland", "");//id=5
			organisationDao.create("Bayrische Motoren Werke AG", "Petuelring ", "130", "München", "80809", "Deutschland", "");//id=6
			organisationDao.create("SAS Institue Inc.", "SAS Campus Drive", "100", "Cary", "27513-2414", "USA, North Carolina", "");//id=7
			organisationDao.create("Ernst & Young GmbH Wirtschaftsprüfungsgesellschaft", "Arnulfstraße", "59", "München", "80636", "Deutschland", "");//id=8
			organisationDao.create("MAN Truck + Bus Deutschland GmbH", "Dachauer Straße", "667", "München", "80995", "Deutschland", "");//id=9
			organisationDao.create("Deloitte & Touche GmbH Wirtschaftsprüfungsgesellschaft", "Rosenheimer Platz", "4", "München", "81669", "Deutschland", "");//id=010
			organisationDao.create("Fujitsu Technology Solutions GmbH", "Mies van der Rohe Straße", "8", "München", "80807", "Deutschland", "Highlight Towers");//id=011
			organisationDao.create("T-Systems AG", "Dingolfinger Straße", "1-15", "München", "81673", "Deutschland", "");//id=012
			organisationDao.create("Amadeus FjRe AG", "Leonrodstraße", "54", "München", "80636", "Deutschland", "");//id=013
			organisationDao.create("Huxley Associates Sas", "Avenue Andrße Prothin", "20", "Courbevoie", "92040", "Frankreich", "");//id=014
			organisationDao.create("E.ON AG", "Brienner Straße", "40", "München", "80333", "Deutschland", "");//id=015
			organisationDao.create("PriceWaterhouseCoopers AG Wirtschaftsprüfungsgesellschaft", "Bernhard Wicki Straße", "8", "München", "80636", "Deutschland", "");//id=016
			organisations = organisationDao.findAll();
		}
		if(applicationDao.findAll().isEmpty()){
			applicationDao.create("position", "contactPerson", new Date(), new Date(), "Description","www.monster.de", organisations.get(0),users.get(0));
			applicationDao.create("IT-Leiter", "Reinhold Holzer", new Date(), new Date(), "Description", "www.monster.de", organisations.get(1),users.get(1)); 
			//Die Folgende TestApplication hat eine Beschreibung von ca. 3000 Zeichen, was in etwa einer ordentlichen Jobbeschreibung entspricht
			applicationDao.create("Senior Consultant (w/m) Audit", "Franziska König", new Date(2012, 05, 25), new Date(2012,06,07), "PwC. Das ist berufliche Vielfalt und gelebte Kollegialität in einem internationalen Umfeld. Werden Sie Teil unseres Teams und nutzen Sie die zahlreichen Weiterbildungsangebote. Geben Sie Ihrer Karriere außergewöhnliche Perspektiven. " + System.getProperty("line.separator") + 
						"Senior Consultant (w/m) Audit" + System.getProperty("line.separator") + 
						"Die Aufgaben" + System.getProperty("line.separator") + 
							"die Ihren Horizont erweitern" + System.getProperty("line.separator") + 
							System.getProperty("line.separator") + 
							"Sie prüfen und beraten zusammen mit Ihren Teamkollegen nationale und internationale Industrie-, Handels- und Dienstleistungsunternehmen" + System.getProperty("line.separator") + 
							"Neben der Prüfungsplanung, -leitung und -koordination vor Ort präsentieren Sie die Ergebnisse beim Mandanten"+ System.getProperty("line.separator") + 
							"Es erwartet Sie ein breites Aufgabenspektrum, z.B. die Prüfung von handelsrechtlichen Einzel- und Konzernabschlüssen sowie Jahresabschlüssen nach internationalen Bilanzierungsstandards, Überleitungsprojekte von HGB auf internationale Rechnungslegungsvorschriften ferner gutachterliche und beratende Tätigkeiten" + System.getProperty("line.separator") + 
							"Sie erhalten einen Einblick in verschiedenste Branchen, Unternehmen, Themen und Teams" + System.getProperty("line.separator") + 
							"Wir fördern Ihre Entwicklung durch intensives, praxisbezogenes Coaching sowie umfassende Schulungsprogramme und die Unterstützung von Berufsexamina"+ System.getProperty("line.separator") + 
						System.getProperty("line.separator") + 
						"Das Profil"+ System.getProperty("line.separator") + 
							"das unseren Horizont erweitert"+ System.getProperty("line.separator") + 
						""+ System.getProperty("line.separator") + 
							"Sie haben Ihr wirtschaftswissenschaftliches Studium (Bachelor/Diplom/Master) mit Schwerpunkten wie Wirtschaftsprüfung, Rechnungswesen oder Controlling erfolgreich abgeschlossen, bzw. stehen kurz vor dem Abschluss Ihres berufsbegleitenden Studium und haben schon erste Berufserfahrung gesammelt"+ System.getProperty("line.separator") + 
							"Ihre analytischen und kommunikativen Fähigkeiten können Sie verbunden mit Ihrer Eigeninitiative in einem Projektteam erfolgreich einsetzen"+ System.getProperty("line.separator") + 
							"Ihre guten Englischkenntnisse zeichnen Sie aus" + System.getProperty("line.separator") + 
							"Die im Beratungsumfeld notwendige Flexibilität und Mobilität runden Ihr Profil ab"+ System.getProperty("line.separator") + 
							""+ System.getProperty("line.separator") + 
							"Prüfen, beraten und sich auskennen. In den Branchen unserer Mandanten, ihrem Wettbewerbsumfeld sowie ihren nationalen und globalen Rahmenbedingungen. Mit einem globalen Netzwerk für die Bereiche Assurance, Tax&Legal und Advisory. Das ist PwC und darum sind wir heute eine der renommiertesten Prüfungs- und Beratungsgesellschaften der Welt. Wir – das sind 8.900 Mit- und Vorausdenker an 28 Standorten in Deutschland und 169.000 in 154 Ländern weltweit."+ System.getProperty("line.separator") + 
"", "www.monster.de", organisations.get(16), users.get(0));
			
		}

	}

	/**
	 * Helper to return the uiHandler attached to a unique application.
	 */
	public UiHandler getUiHandler() {
		return thisApplication.get().ui;
	}

	/**
	 * For ThreadLocal pattern.
	 * Same WebApplicationContext (session) may contain multiple different
	 * Toolkit applications, here we are only interested of
	 * JobApplication related transaction events.
	 */
	public void transactionStart(Application application, Object transactionData) {
		
		if (application == MyJobApplication.this) {
			thisApplication.set(this);
		}
	}

	/**
	 * For ThreadLocal pattern, remove application reference
	 */
	public void transactionEnd(Application application, Object transactionData) {
		if (application == MyJobApplication.this) {
			thisApplication.set(null);
		}
	}

}
